home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Lazy.st < prev    next >
Text File  |  1993-07-24  |  3KB  |  99 lines

  1. "    NAME        Lazy
  2.     AUTHOR        miw@cs.man.ac.uk
  3.     FUNCTION    implements lazy evaluation
  4.     ST-VERSION    2.2
  5.     PREREQUISITES    
  6.     CONFLICTS
  7.     DISTRIBUTION    world
  8.     VERSION        1
  9.     DATE    22 Jan 1989
  10. SUMMARY Lazy implements lazy objects (which are given a block to compute 
  11. their value, but only do so on demand) MIW.
  12. "
  13. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 25 February 1988 at 9:51:47 pm'!
  14.  
  15. Object subclass: #Lazy
  16.     instanceVariableNames: 'result done args '
  17.     classVariableNames: ''
  18.     poolDictionaries: ''
  19.     category: 'Kernel-Processes'!
  20. Lazy comment:
  21. 'I represent an execution which may not be required.  I will
  22. not start execution until at least one message has been
  23. received.  The messages sent to me are delayed until execution
  24. has completed.'!
  25.  
  26.  
  27. !Lazy methodsFor: 'initializing'!
  28.  
  29. block: aBlock
  30.     done _ false.
  31.     result _ aBlock.
  32.     args _ #()!
  33.  
  34. block: aBlock value: value
  35.     done _ false.
  36.     result _ aBlock.
  37.     args _ Array with: value!
  38.  
  39. block: aBlock value: value1 value: value2
  40.     done _ false.
  41.     result _ aBlock.
  42.     args _ Array with: value1 with: value2!
  43.  
  44. block: aBlock value: value1 value: value2 value: value3
  45.     done _ false.
  46.     result _ aBlock.
  47.     args _ Array with: value1 with: value2 with: value3!
  48.  
  49. block: aBlock valueWithArguments: anArray
  50.     done _ false.
  51.     result _ aBlock.
  52.     args _ anArray! !
  53.  
  54. !Lazy methodsFor: 'evaluating'!
  55.  
  56. doesNotUnderstand: aMessage
  57.     done ifFalse:    "this really should be a critical region"
  58.              [result _ result valueWithArguments: args. done _ true].
  59.     ^result perform: aMessage selector withArguments: aMessage arguments! !
  60. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  61.  
  62. Lazy class
  63.     instanceVariableNames: ''!
  64.  
  65.  
  66. !Lazy class methodsFor: 'class initialisation'!
  67.  
  68. initialize
  69.     superclass _ nil     "must avoid the checks"
  70.  
  71.     "Lazy initialize"! !
  72.  
  73. Lazy initialize!
  74. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 25 February 1988 at 9:51:56 pm'!
  75.  
  76.  
  77.  
  78. !BlockContext methodsFor: 'lazy evaluation'!
  79.  
  80. lazyValue
  81.     "Return an object that knows how to evaluate me if called on to do so."
  82.     ^Lazy new block: self!
  83.  
  84. lazyValue: value
  85.     "Return an object that knows how to evaluate me if called on to do so."
  86.     ^Lazy new block: self value: value!
  87.  
  88. lazyValue: value1 value: value2
  89.     "Return an object that knows how to evaluate me if called on to do so."
  90.     ^Lazy new block: self value: value1 value: value2!
  91.  
  92. lazyValue: value1 value: value2 value: value3
  93.     "Return an object that knows how to evaluate me if called on to do so."
  94.     ^Lazy new block: self value: value1 value: value2 value: value3!
  95.  
  96. lazyValueWithArguments: anArray
  97.     "Return an object that knows how to evaluate me if called on to do so."
  98.      ^Lazy new block: self valueWithArguments: anArray! !
  99.